package org.study.javafx.study01.grid.code;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.study.javafx.study01.AppStarter;
import org.study.javafx.study01.config.AppConfig;

/**
 * 参考 https://www.cnblogs.com/pinlantu/p/11391211.html
 *
 * @author doveylovey
 * @version v1.0.0
 * @email 1135782208@qq.com
 * @date 2024年08月18日
 */
@Slf4j
public class GridCode2 extends Application {
    /**
     * 直接运行此方法会报如下错误：
     * 错误: 缺少 JavaFX 运行时组件, 需要使用该组件来运行此应用程序
     * 请运行 {@link AppStarter#main(String[])}
     */
    public static void main(String[] args) {
        AppConfig.init();
        launch(args);
    }

    @Override
    public void init() throws Exception {
        super.init();
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        VBox vBox = new VBox(10);

        // 创建下拉框
        ComboBox<String> comboBox = new ComboBox<>();
        // 设置下拉框能否编辑。默认不允许编辑
        comboBox.setEditable(false);
        // 设置下拉框的数据来源
        // comboBox.setItems(FXCollections.observableArrayList(Lists.newArrayList()));
        comboBox.getItems().addAll("下拉选项A", "下拉选项B", "下拉选项C", "下拉选项D", "下拉选项E");
        // 默认选中
        comboBox.getSelectionModel().select(0);
        // 创建一个标签
        Label comboBoxLabel = new Label("下拉框的选择结果");
        // 设置标签文本是否支持自动换行
        comboBoxLabel.setWrapText(true);
        // 设置标签文字的颜色
        comboBoxLabel.setTextFill(Color.BLUE);
        vBox.getChildren().addAll(comboBox, comboBoxLabel);
        // 设置下拉框的选择监听器
        comboBox.getSelectionModel().selectedItemProperty().addListener((arg0, oldStr, newStr) -> {
            SingleSelectionModel<String> selectionModel = comboBox.getSelectionModel();
            // getSelectedIndex()方法可获得选中项的序号，getSelectedItem()方法可获得选中项的对象
            String desc = String.format("在下拉框中，选择的是第%d项，名称为%s", selectionModel.getSelectedIndex(), selectionModel.getSelectedItem());
            // 在标签上显示当前选中的文本项
            comboBoxLabel.setText(desc);
        });

        // 创建单选按钮
        ToggleGroup toggleGroup = new ToggleGroup();
        RadioButton radioButtonA = new RadioButton("单选项A");
        // 默认选中
        radioButtonA.setSelected(true);
        radioButtonA.setToggleGroup(toggleGroup);
        RadioButton radioButtonB = new RadioButton("单选项B");
        radioButtonB.setToggleGroup(toggleGroup);
        RadioButton radioButtonC = new RadioButton("单选项C");
        radioButtonC.setToggleGroup(toggleGroup);
        RadioButton radioButtonD = new RadioButton("单选项D");
        radioButtonD.setToggleGroup(toggleGroup);
        // 创建一个标签
        Label toggleGroupLabel = new Label("单选框的选择结果");
        // 设置标签文本是否支持自动换行
        toggleGroupLabel.setWrapText(true);
        // 设置标签文字的颜色
        toggleGroupLabel.setTextFill(Color.RED);
        vBox.getChildren().addAll(radioButtonA, radioButtonB, radioButtonC, radioButtonD, toggleGroupLabel);
        // 设置单选组合的单击监听器
        toggleGroup.selectedToggleProperty().addListener((arg0, oldToggle, newToggle) -> {
            // 在标签上显示当前选中的单选按钮文本
            toggleGroupLabel.setText("在单选框中，选择的是" + ((RadioButton) newToggle).getText());
        });

        // 创建复选框
        CheckBox checkBoxA = new CheckBox("复选项A");
        // 默认选中
        checkBoxA.setSelected(true);
        CheckBox checkBoxB = new CheckBox("复选项B");
        CheckBox checkBoxC = new CheckBox("复选项C");
        CheckBox checkBoxD = new CheckBox("复选项D");
        CheckBox checkBoxE = new CheckBox("复选项E");
        // 创建一个标签
        Label checkBoxLabel = new Label("多选框的选择结果");
        // 设置标签文本是否支持自动换行
        checkBoxLabel.setWrapText(true);
        // 设置标签文字的颜色
        checkBoxLabel.setTextFill(Color.GREEN);
        vBox.getChildren().addAll(checkBoxA, checkBoxB, checkBoxC, checkBoxD, checkBoxE, checkBoxLabel);
        // 构建复选框数组
        CheckBox[] checkBoxArray = new CheckBox[]{checkBoxA, checkBoxB, checkBoxC, checkBoxD, checkBoxE};
        // 设置复选框的勾选监听器
        checkBoxA.selectedProperty().addListener((arg0, arg1, arg2) -> {
            // 拼接并显示当前的勾选结果，以及已经勾选的所有项
            checkBoxLabel.setText(String.format("在多选框中，%s了%s，当前已选择项包括：%s", (checkBoxA.isSelected() ? "选择" : "取消"), checkBoxA.getText(), getCheckedItem(checkBoxArray)));
        });
        checkBoxB.selectedProperty().addListener((arg0, arg1, arg2) -> {
            checkBoxLabel.setText(String.format("在多选框中，%s了%s，当前已选择项包括：%s", (checkBoxB.isSelected() ? "选择" : "取消"), checkBoxB.getText(), getCheckedItem(checkBoxArray)));
        });
        checkBoxC.selectedProperty().addListener((arg0, arg1, arg2) -> {
            checkBoxLabel.setText(String.format("在多选框中，%s了%s，当前已选择项包括：%s", (checkBoxC.isSelected() ? "选择" : "取消"), checkBoxC.getText(), getCheckedItem(checkBoxArray)));
        });
        checkBoxD.selectedProperty().addListener((arg0, arg1, arg2) -> {
            checkBoxLabel.setText(String.format("在多选框中，%s了%s，当前已选择项包括：%s", (checkBoxD.isSelected() ? "选择" : "取消"), checkBoxD.getText(), getCheckedItem(checkBoxArray)));
        });
        checkBoxE.selectedProperty().addListener((arg0, arg1, arg2) -> {
            checkBoxLabel.setText(String.format("在多选框中，%s了%s，当前已选择项包括：%s", (checkBoxE.isSelected() ? "选择" : "取消"), checkBoxE.getText(), getCheckedItem(checkBoxArray)));
        });

        Scene scene = new Scene(vBox, 500, 300);
        primaryStage.setTitle("JavaFx示例：下拉框、单选框、复选框");
        // 窗口最大化
        primaryStage.setMaximized(true);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    // 获取已选的项
    private String getCheckedItem(CheckBox[] checkBoxArray) {
        StringBuilder result = new StringBuilder();
        // 遍历复选框数组
        for (CheckBox checkBox : checkBoxArray) {
            // 复选框被选中
            if (checkBox.isSelected()) {
                if (StringUtils.isNotBlank(result)) {
                    result.append("、");
                }
                // 结果追加选定的项
                result.append(checkBox.getText());
            }
        }
        return result.toString();
    }

    @Override
    public void stop() throws Exception {
        super.stop();
    }
}
